抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

标题的内容已经将主题点明了,通过这一篇的学习我觉得可以考虑带入前端H5和CSS编写网页的思路来理解。使用Subform实现可以简单理解成前端DIV设置了浮动的属性。而使用Table来撑满整个网页的前端设计和这里有异曲同工之感。

Adobe Form打印两个相邻的表格

一、介绍

标题的内容已经将主题点明了,通过这一篇的学习我觉得可以考虑带入前端H5和CSS编写网页的思路来理解。使用Subform实现可以简单理解成前端DIV设置了浮动的属性。而使用Table来撑满整个网页的前端设计和这里有异曲同工之感。

二、功能实现

之前已经介绍过很多次创建过程了,所以这里就不再介绍如何创建Interface和Adobe Form对象了。直接从设置内容开始。

1.Interface

(1)添加输入参数

1.Interface_输入参数

(2)定义全局类型

2.Interface_全局类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
TYPES:
BEGIN OF TY_MATERIAL,
MATNR TYPE MATNR,
MATKL TYPE MATKL,
BISMT TYPE BISMT,
END OF TY_MATERIAL,

BEGIN OF TY_PLANT,
MATNR TYPE MATNR,
WERKS TYPE WERKS_D,
PSTAT TYPE PSTAT_D,
DISPR TYPE DISPR,
END OF TY_PLANT,

BEGIN OF TY_EKPO,
EBELN TYPE EBELN,
EBELP TYPE EBELP,
TXZ01 TYPE TXZ01,
MENGE TYPE BSTMG,
MEINS TYPE BSTME,
END OF TY_EKPO.

TYPES:
TT_MATNR TYPE STANDARD TABLE OF TY_MATERIAL,
TT_PLANT TYPE STANDARD TABLE OF TY_PLANT,
TTEKPO TYPE STANDARD TABLE OF TY_EKPO.

(3)定义全局变量

3.Interface_全局变量

(4)初始化逻辑

4.Interface_初始化逻辑

(5)Form 逻辑

5.Interface_Form逻辑
1
2
3
4
5
6
7
8
9
10
11
12
FORM GET_MARA USING V_ROW_L.
SELECT MATNR MATKL BISMT FROM MARA INTO CORRESPONDING FIELDS OF TABLE IT_MARA UP TO V_ROW_L ROWS.
ENDFORM.

FORM GET_MARC USING V_ROW_L.
SELECT MATNR WERKS PSTAT DISPR FROM MARC INTO CORRESPONDING FIELDS OF TABLE IT_MARC UP TO V_ROW_L ROWS.
ENDFORM.

FORM GET_EKPO USING V_ROW_R.
SELECT EBELN EBELP TXZ01 MENGE MEINS
FROM EKPO INTO CORRESPONDING FIELDS OF TABLE IT_EKPO UP TO V_ROW_R ROWS.
ENDFORM.

2.Adobe Form

(1)创建Adobe Form

使用事物代码 SFP 创建Adobe Form 对象。绑定对应的Interface对象。然后将在Interface中创建的全局变量导入到Adobe Form中。

6.Adobe Form_新建Form

(2)创建文本抬头

Page1下新建一个Subform,然后添加一个文本对象。

① 插入Subform
7.Adobe Form_插入SubForm
② 新建文本对象
8.Adobe Form_新建文本对象

将新建好的文本对象放在上面新建的Subform下面。

9.Adobe Form_抬头部分

(3)设置表格分页

选中DetailBody对象,然后设置其SubformContent对象的属性为Flowed。然后选中 Allow Page Breaks Within Content

10.Adobe Form_DetailBody

(4)新建总Subform

在DetailBody下新建一个新的总SubForm对象。然后设置其SubformContent对象的属性为Flowed,然后选中 Allow Page Breaks Within Content ,最后再修改Flow Direction的值为Westem Text后面所有的SubForm对象都需要设置这三个属性。

11.Adobe Form_总Subform

再设置下总Subform的Margins - top为1.2in。这样不会让数据与上面的文本抬头重叠。

30.Adobe Form_总Subform外边距

到这个地方就完成了全部公共的内容。下面是两种方案的介绍。

(5)测试源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
PARAMETERS:
P_ROWL TYPE I, " Number of Rows
P_ROWR TYPE I. " Number of Rows

CONSTANTS : GV_FORM_NAME TYPE FPNAME VALUE 'YADOBE_FORM_DEMO12'.
**&&~~ Data Objects
DATA: GV_FM_NAME TYPE RS38L_FNAM, " FM Name
GS_FP_DOCPARAMS TYPE SFPDOCPARAMS,
GS_FP_OUTPUTPARAMS TYPE SFPOUTPUTPARAMS.

*&---------------------------------------------------------------------*
**&&~~ Form Processing: Call Form - Open
*
CALL FUNCTION 'FP_JOB_OPEN'
CHANGING
IE_OUTPUTPARAMS = GS_FP_OUTPUTPARAMS
EXCEPTIONS
CANCEL = 1
USAGE_ERROR = 2
SYSTEM_ERROR = 3
INTERNAL_ERROR = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
" Suitable Error Handling
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Get the Function module name based on Form Name
*
CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
EXPORTING
I_NAME = GV_FORM_NAME
IMPORTING
E_FUNCNAME = GV_FM_NAME.
IF SY-SUBRC <> 0.
" Suitable Error Handling
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Take the FM name by executing the form - by using Pattern-
**&&~~ call that FM and replace the FM Name by gv_fm_name
*
**&&~~ Call the Generated FM
CALL FUNCTION GV_FM_NAME "'/1BCDWB/SM00000176'
EXPORTING
/1BCDWB/DOCPARAMS = GS_FP_DOCPARAMS
V_ROW_R = P_ROWR
V_ROW_L = P_ROWL
EXCEPTIONS
USAGE_ERROR = 1
SYSTEM_ERROR = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.

* Implement suitable error handling here
ENDIF.
*&---------------------------------------------------------------------*
**&&~~ Form Processing: Call Form - Open
*
CALL FUNCTION 'FP_JOB_CLOSE'
* IMPORTING
* E_RESULT =
EXCEPTIONS
USAGE_ERROR = 1
SYSTEM_ERROR = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

3.方案一 Subform

(1)说明

这种方式是通过SubForm来实现的。但是和教程网站不一样,我虽然通过对齐方式等设置完成了符合预期的内容,但是存在新的问题。左侧的数据内容如果过多,会将右侧的内容挤到下面的页去。

(2)新建Subform

新建如下所示的Subform对象。然后设置他们的SubformContent对象的属性为Flowed,然后选中 Allow Page Breaks Within Content ,最后再修改Flow Direction的值为Westem Text

12.Adobe Form_子项Subform

在Layout页签中的设置如下。

13.Adobe Form_子项Subform_Layout

(3)新加数据Subform

同理需要设置和上面Subform一样的属性内容。SubformContent对象的属性为Flowed,然后选中 Allow Page Breaks Within Content ,最后再修改Flow Direction的值为Westem Text

14.Adobe Form_数据Subform

Layout的属性内容如下所示。请注意各个Subform不同的对齐方式。

15.Adobe Form_数据Subform_Layout

(4)添加数据表

在对应的数据Subform下新加从Interface中创建的全局变量。然后勾选表对象的Object —> Table 的 Allow Page Breaks within Content

16.Adobe Form_Table

(5)Form测试

① 选择屏幕
17.Adobe Form_Subform_Test_Selection Screen
② 执行结果
18.Adobe Form_Subform_Test_result

这么看似乎是满足了需求,而教程网站上的内容在第二页开始就靠左显示了。然后我尝试修改了Subform的对齐方式,让右边的Subform向右对齐就不会出现问题了。

但是使用这种方式创建的PDF有个新问题,并且我无法知晓教程中的Form是否存在同样的问题。那就是当左侧的表数据过多时,会将右侧的数据撑到下一页。

19.Adobe Form_Subform_Test_Selection Screen 20.Adobe Form_Subform_Test_Result

我尝试修改了左侧Subform的其他属性,但遗憾的是并没有什么效果。只要左侧的数据变多就会将右侧的数据挤到后面的页。

4.方案二 Table

(1)说明

这种设计思路和前端通过Table来控制元素在网页上展示内容的方式类似。通过表格的行列来控制元素的位置。对应到这个需求的话就相当于是创建一个单行两列的Table对象。

(2)新建Table对象

选中SubformToHold2SubForms对象,然后点击上面的Insert —> Standard —> Table

21.Adobe Form_Table_Insert Table 22.Adobe Form_Table_Table属性

新建好的Table对象如下所示。同时修改Table的名称为TwoColTables。然后将表格横向拉长到合适的宽度。

23.Adobe Form_Table_Table对象

(3)修改Table Row属性

选中Cell1右键设置为 Wrap in Subform。同理将Cell2也设置为这个属性。

24.Adobe Form_Table_设置Table Row属性

设置好的Table对象如下所示,同时重命名两个Subform对象,并删除两个文本对象 Cell1 与 Cell2。

25.Adobe Form_Table_Table Subform

(4)拖放数据对象

将上面LHSandRHS对象下的LHS与RHS对象拖放到表对象对应的Subform中。

26.Adobe Form_Table_拖放 Subform

完成后的表格对象内容如下所示。

27.Adobe Form_Table_操作完成

(5)设置表格Subform的属性

最后一个步骤,需要让表格中的部分Subform被定位。

28.Adobe Form_Table_操作完成

双击选中Row1对象,勾选中 Allow Page Breaks within Content,否则表格不会翻页。

29.Adobe Form_Table_操作完成

(6)Form 测试

① 选择屏幕

使用上面的问题数据进行测试。

31.Adobe Form_Test_Selection Screen
② 执行结果
32.Adobe Form_Test_Result

结果没有问题,符合预期。

三、参考资料

SAP Adobe Form Tutorial. Part XIII. How to Print two Tables Adjacent to each other?

评论